// $License: NOLICENSE
//--------------------------------------------------------------------------------
/**
  @file save_log.ctl
  @copyright Siemens
  @author zhigang-li@siemens.com

  功能：
  将PVSS_II.log.bak改名为PVSS_II.<TIME>.log，移动到 log/backup文件夹下，用于长期保留日志的作用。

  删除条件：
  至多保留 BACKUP_LOG_FILES_NUMBER 数量 且 至多保留 backup_log_files_lockDays 天数

*/

//--------------------------------------------------------------------------------

const int BACKUP_LOG_FILES_NUMBER = 300; // 日志备份文件的数量
const int BACKUP_LOG_FILES_DAYS = 30; //  保留的天数，单位：天

//--------------------------------------------------------------------------------
/**
*/
main()
{
  // 检测 log/backup/ 文件夹是否存在 , 不存在则创建
  if (!isdir(getPath(LOG_REL_PATH) + "backup/"))
  {
    mkdir(getPath(LOG_REL_PATH) + "backup/");
  }

  // 周期循环检测是否有新的 log/PVSS_II.log.bak 文件？若有,则剪切到log/backup/文件夹下，用于长期保存
  while (1)
  {
    //
    if (isfile(getPath(LOG_REL_PATH) + "PVSS_II.log.bak"))
    {
      // 剪切到备份路径下，文件的命名：PVSS_II.<TIME>.log
      moveFile(getPath(LOG_REL_PATH) + "PVSS_II.log.bak",
               getPath(LOG_REL_PATH) + "/backup/PVSS_II." + (string)(uint)getCurrentTime() + ".log" );
    }

    // 检测 log/backup/ 目录下的所有的备份的日志的时间戳，找到过期的。
    dyn_string dsFiles = getFileNames(getPath(LOG_REL_PATH) + "/backup/",  "*.log", FILTER_FILES);

    // 1. 时间。至多保留 backup_log_files_lockDays 天数
    for (int i = 1 ; i <= dynlen(dsFiles); i++)
    {

      // 获得文件创建的时间戳
      time tFileTime = getFileModificationTime(getPath(LOG_REL_PATH) + "/backup/" + dsFiles[i]);

      // 判断是否超过天数。
      if (tFileTime < (getCurrentTime() - BACKUP_LOG_FILES_DAYS * 24 * 3600))
      {
        // 仅删除时间范围在()删除此文件，且数量
        remove(getPath(LOG_REL_PATH) + "/backup/" + dsFiles[i]);
        //DebugN("[time]删除" + getPath(LOG_REL_PATH) + "/backup/" + dsFiles[i] );
      }
    }

    // 2. 数量 至多保留 BACKUP_LOG_FILES_NUMBER 数量
    // 刷新dsFiles
    // dsFiles 默认排序是顺序：时间小的排在前面
    // DebugN(dsFiles);
    dsFiles = getFileNames(getPath(LOG_REL_PATH) + "/backup/",  "*.log", FILTER_FILES);

    // 从第一个开始删，删除最久的。
    for (int i = 1 ; i <= dynlen(dsFiles) - BACKUP_LOG_FILES_NUMBER ; i++)
    {
      remove(getPath(LOG_REL_PATH) + "/backup/" + dsFiles[i]) ;
      //DebugN("[数量]删除" + getPath(LOG_REL_PATH) + "/backup/" + dsFiles[i] );
    }

    delay(5);
  }
}
























